iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0
Python

眾裏尋它:Python表格利器Great Tables系列 第 24

[Day24] - 如何與Streamlit整合 - 靜態表格

  • 分享至 

  • xImage
  •  

今天我們來說明如何將gt表格呈現於Streamlit app中。

本日程式碼將存在main.py檔中,內容參考自官方Solar Zenith Angles範例

步驟1:建立回傳Polars DataFrame的get_sza()函數

get_sza()會返回一個Polars DataFrame,是由gt提供的sza Pandas DataFrame轉換而來。由於DataFrame於此app中不會變動,所以可以將@st.cache_data(註1)裝飾在get_sza()上。

import polars as pl
import streamlit as st
from great_tables.data import sza


@st.cache_data
def get_sza():
    return pl.from_pandas(sza)

步驟2:建立回傳表格的get_sza_gt()函數

get_sza_gt()中為Polars DataFrame的整理過程及表格的製作過程。

from great_tables import GT, html


def get_sza_gt():
    sza_pivot = (
        get_sza()
        .filter((pl.col("latitude") == "20") & (pl.col("tst") <= "1200"))
        .select(pl.col("*").exclude("latitude"))
        .drop_nulls()
        .pivot(values="sza", index="month", on="tst", sort_columns=True)
    )

    return (
        GT(sza_pivot, rowname_col="month")
        .data_color(
            domain=[90, 0],
            palette=["rebeccapurple", "white", "orange"],
            na_color="white",
        )
        .tab_header(
            title="Solar Zenith Angles from 05:30 to 12:00",
            subtitle=html("Average monthly values at latitude of 20&deg;N."),
        )
        .sub_missing(missing_text="")
    )

步驟3:使用st.write()呈現表格

st.title("Great Tables shown in Streamlit")
st.write(get_sza_gt().as_raw_html(), unsafe_allow_html=True)

get_sza_gt().as_raw_html()為整合的關鍵。我們使用GT.as_raw_html()來生成HTML,並置於st.write中。此外,這邊必須要將unsafe_allow_html參數設定為True,此舉是告訴Streamlit,我們所提供的HTML是安全的,請照實呈現。

步驟4:啟動Streamlit server

於命令列中執行下列指令:

streamlit run main.py

接著打開瀏覽器前往預設網址,如http://127.0.0.1:8000/,就可以見到下面這個漂亮的表格:

table

其它參考作法

如果覺得每次使用st.write(),都要記得使用GT.as_raw_html()作為輸入並設定unsafe_allow_html參數為True很麻煩的話,可以參考下面這個裝飾器的寫法:

from functools import wraps

import polars as pl
import streamlit as st
from great_tables import GT, html
from great_tables.data import sza


def gt2streamlit(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        gtbl = func(*args, **kwargs)
        gtbl_html = gtbl.as_raw_html()
        return st.write(gtbl_html, unsafe_allow_html=True)

    return wrapper


@st.cache_data
def get_sza():
    return pl.from_pandas(sza)


@gt2streamlit
def st_write_gt(df):
    sza_pivot = (
        df
        .filter((pl.col("latitude") == "20") & (pl.col("tst") <= "1200"))
        .select(pl.col("*").exclude("latitude"))
        .drop_nulls()
        .pivot(values="sza", index="month", on="tst", sort_columns=True)
    )

    return (
        GT(sza_pivot, rowname_col="month")
        .data_color(
            domain=[90, 0],
            palette=["rebeccapurple", "white", "orange"],
            na_color="white",
        )
        .tab_header(
            title="Solar Zenith Angles from 05:30 to 12:00",
            subtitle=html("Average monthly values at latitude of 20&deg;N."),
        )
        .sub_missing(missing_text="")
    )


st.title("Great Tables shown in Streamlit")
st_write_gt(get_sza())

這裡我們希望能夠建立st_write_gt()來代替st.write(),其接收一個GT instance,並藉由所裝飾的@gt2streamlit來完成上述兩項工作,即以GT.as_raw_html()作為st.write()輸入及設定unsafe_allow_html參數為True

如果對裝飾器這個概念仍然不是那麼清楚的朋友,可以參考我於2023年鐵人賽的系列文 ── Python十翼:與未來的自己對話,其中有詳細的說明。

備註

註1:其實Streamlit中還有一個st.cache_resource功能。兩者的使用時機,可以參考官方文件關於cache的解釋,我們這邊應該比較適合使用st.cache_data

Code

本日所有程式碼可參考gt-streamlit repo。


上一篇
[Day23] - 範例4:Euro NCAP 2023安全評分表(2)
下一篇
[Day25] - 如何與FastAPI整合 - 靜態表格
系列文
眾裏尋它:Python表格利器Great Tables30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言